热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

干货|不了解这些多线程的基础知识,很难学懂Android!

目录
目录
干货 | 不了解这些多线程的基础知识,很难学懂Android!

简介
干货 | 不了解这些多线程的基础知识,很难学懂Android!

下面,我将结合实例,详细介绍GestureDetector的使用接口 & 使用类。


接口1:OnGestureListener

1. 作用

检测用户在屏幕的以下操作:按下瞬间、按压、长按、轻击、快速滑屏、拖动

2. 使用步骤

// 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法) // 构造函数有3个,常用的是第二个 // 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener); // 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener); // 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener); GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() { // 1. 用户轻触触摸屏 public boolean onDown(MotionEvent e) { Log.i("MyGesture", "onDown"); return false; } // 2. 用户轻触触摸屏,尚未松开或拖动 // 与onDown()的区别:无松开 / 拖动 // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行 public void onShowPress(MotionEvent e) { Log.i("MyGesture", "onShowPress"); } // 3. 用户长按触摸屏 public void onLongPress(MotionEvent e) { Log.i("MyGesture", "onLongPress"); } // 4. 用户轻击屏幕后抬起 public boolean onSingleTapUp(MotionEvent e) { Log.i("MyGesture", "onSingleTapUp"); return true; } // 5. 用户按下触摸屏 & 拖动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true; } // 6. 用户按下触摸屏、快速移动后松开 // 参数: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling"); return true; } }); // 步骤2-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应 View.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; // 注:返回true才能完整接收触摸事件 } }); // 步骤2-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应 @Override public boolean dispatchTouchEvent(MotionEvent ev) { mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件 super.dispatchTouchEvent(ev); // 让Activity响应触碰事件 return false; }

3. 实例说明

现在对一个TextView进行手势检测
activity_main.xml

MainActivity.java

public class MainActivity extends AppCompatActivity { TextView mTextView; GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法) mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() { // 1. 用户轻触触摸屏 public boolean onDown(MotionEvent e) { Log.i("MyGesture", "onDown"); return false; } // 2. 用户轻触触摸屏,尚未松开或拖动 // 与onDown()的区别:无松开 / 拖动 // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行 public void onShowPress(MotionEvent e) { Log.i("MyGesture", "onShowPress"); } // 3. 用户长按触摸屏 public void onLongPress(MotionEvent e) { Log.i("MyGesture", "onLongPress"); } // 4. 用户轻击屏幕后抬起 public boolean onSingleTapUp(MotionEvent e) { Log.i("MyGesture", "onSingleTapUp"); return true; } // 5. 用户按下触摸屏 & 拖动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true; } // 6. 用户按下触摸屏、快速移动后松开 // 参数: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling"); return true; } }); // 步骤2:让TextView检测手势:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应 mTextView = (TextView) findViewById(R.id.textView); mTextView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return false; } }); } }

4. 示意图

我在屏幕作出一系列手势进行测试

干货 | 不了解这些多线程的基础知识,很难学懂Android!

接口2:OnDoubleTapListener

1. 作用

检测用户单击、双击屏幕

2. 使用步骤

// 步骤1:创建手势检测器实例 // 注:使用OnDoubleTapListener接口时,需要使用GestureDetector,而GestureDetector的创建则必须传入OnGestureListener接口 // 所以在使用OnDoubleTapListener接口时,也必须实现OnGestureListener接口 // 构造函数有3个,常用的是第二个 // 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener); // 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener); // 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener); GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() { // 1. 用户轻触触摸屏 public boolean onDown(MotionEvent e) { Log.i("MyGesture", "onDown"); return false; } // 2. 用户轻触触摸屏,尚未松开或拖动 // 与onDown()的区别:无松开 / 拖动 // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行 public void onShowPress(MotionEvent e) { Log.i("MyGesture", "onShowPress"); } // 3. 用户长按触摸屏 public void onLongPress(MotionEvent e) { Log.i("MyGesture", "onLongPress"); } // 4. 用户轻击屏幕后抬起 public boolean onSingleTapUp(MotionEvent e) { Log.i("MyGesture", "onSingleTapUp"); return true; } // 5. 用户按下触摸屏 & 拖动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true; } // 6. 用户按下触摸屏、快速移动后松开 // 参数: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling"); return true; } }); // 步骤2:创建 & 设置OnDoubleTapListener接口实现类 mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { // 1. 单击事件 // 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别 // onSingleTapConfirmed:再次点击(即双击),则不会执行 // onSingleTapUp:手抬起就会执行 public boolean onSingleTapConfirmed(MotionEvent e) { Log.i("MyGesture", "onSingleTapConfirmed"); return false; } // 2. 双击事件 public boolean onDoubleTap(MotionEvent e) { Log.i("MyGesture", "onDoubleTap"); return false; } // 3. 双击间隔中发生的动作 // 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件; public boolean onDoubleTapEvent(MotionEvent e) { Log.i("MyGesture", "onDoubleTapEvent"); return false; } }); // 步骤3-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应 View.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; // 注:返回true才能完整接收触摸事件 } }); // 步骤3-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应 @Override public boolean dispatchTouchEvent(MotionEvent ev) { mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件 super.dispatchTouchEvent(ev); // 让Activity响应触碰事件 return false; }

3. 实例说明

现在对一个TextView进行手势检测
activity_main.xml

MainActivity.java

public class MainActivity extends AppCompatActivity { TextView mTextView; GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法) mGestureDetector = new GestureDetector(this, new GestureDetector.OnGestureListener() { // 1. 用户轻触触摸屏 public boolean onDown(MotionEvent e) { Log.i("MyGesture1", "onDown"); return false; } // 2. 用户轻触触摸屏,尚未松开或拖动 // 与onDown()的区别:无松开 / 拖动 // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行 public void onShowPress(MotionEvent e) { Log.i("MyGesture", "onShowPress"); } // 3. 用户长按触摸屏 public void onLongPress(MotionEvent e) { Log.i("MyGesture", "onLongPress"); } // 4. 用户轻击屏幕后抬起 public boolean onSingleTapUp(MotionEvent e) { Log.i("MyGesture", "onSingleTapUp"); return true; } // 5. 用户按下触摸屏 & 拖动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true; } // 6. 用户按下触摸屏、快速移动后松开 // 参数: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling"); return true; } }); // 步骤2:创建 & 设置OnDoubleTapListener接口实现类 mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { // 1. 单击事件 // 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别 // onSingleTapConfirmed:再次点击(即双击),则不会执行 // onSingleTapUp:手抬起就会执行 public boolean onSingleTapConfirmed(MotionEvent e) { Log.i("MyGesture", "onSingleTapConfirmed"); return false; } // 2. 双击事件 public boolean onDoubleTap(MotionEvent e) { Log.i("MyGesture", "onDoubleTap"); return false; } // 3. 双击间隔中发生的动作 // 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件; public boolean onDoubleTapEvent(MotionEvent e) { Log.i("MyGesture", "onDoubleTapEvent"); return false; } }); // 步骤3:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应 mTextView = (TextView) findViewById(R.id.textView); mTextView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; } }); } }

4. 测试效果

日志效果如下

[图片上传失败…(image-1c663d-1595234367877)]


使用类:SimpleOnGestureListener 1. 作用

集成了两个接口的手势检测功能

2. 与上述两个接口的区别
  • OnGestureListener和OnDoubleTapListener接口里的函数都是强制必须重写的
  • 而SimpleOnGestureListener类的函数则可根据需要选择性复写,因为SimpleOnGestureListener类本身已经实现了这两个接口的所有函数,只是里面全是空的而已
3. 使用步骤

// 步骤1:创建手势检测器实例 // 构造函数有3个,此处用的是第三个 // 1. GestureDetector gestureDetector=new GestureDetector(GestureDetector.OnGestureListener listener); // 2. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.OnGestureListener listener); // 3. GestureDetector gestureDetector=new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener); GestureDetector mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { // OnGestureListener接口的函数 // 1. 用户轻触触摸屏 public boolean onDown(MotionEvent e) { Log.i("MyGesture1", "onDown"); return false; } // 2. 用户轻触触摸屏,尚未松开或拖动 // 与onDown()的区别:无松开 / 拖动 // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行 public void onShowPress(MotionEvent e) { Log.i("MyGesture", "onShowPress"); } // 3. 用户长按触摸屏 public void onLongPress(MotionEvent e) { Log.i("MyGesture", "onLongPress"); } // 4. 用户轻击屏幕后抬起 public boolean onSingleTapUp(MotionEvent e) { Log.i("MyGesture", "onSingleTapUp"); return true; } // 5. 用户按下触摸屏 & 拖动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true; } // 6. 用户按下触摸屏、快速移动后松开 // 参数: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling"); return true; } // OnDoubleTapListener的函数 // 1. 单击事件 // 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别 // onSingleTapConfirmed:再次点击(即双击),则不会执行 // onSingleTapUp:手抬起就会执行 public boolean onSingleTapConfirmed(MotionEvent e) { Log.i("MyGesture", "onSingleTapConfirmed"); return false; } // 2. 双击事件 public boolean onDoubleTap(MotionEvent e) { Log.i("MyGesture", "onDoubleTap"); return false; } // 3. 双击间隔中发生的动作 // 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件; public boolean onDoubleTapEvent(MotionEvent e) { Log.i("MyGesture", "onDoubleTapEvent"); return false; } }); // 步骤2-1:让某个View检测手势 - 重写View的onTouch函数,将View的触屏事件交给GestureDetector处理,从而对用户手势作出响应 View.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; // 注:返回true才能完整接收触摸事件 } }); // 步骤2-2:让某个Activity检测手势:重写Activity的dispatchTouchEvent函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应 @Override public boolean dispatchTouchEvent(MotionEvent ev) { mGestureDetector.onTouchEvent(ev); // 让GestureDetector响应触碰事件 super.dispatchTouchEvent(ev); // 让Activity响应触碰事件 return false; }

4. 实例说明

现在对一个TextView进行手势检测
activity_main.xml

MainActivity.java

public class MainActivity extends AppCompatActivity { TextView mTextView; GestureDetector mGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 步骤1:创建手势检测器实例 & 传入OnGestureListener接口(需要复写对应方法) mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { // OnGestureListener接口的函数 // 1. 用户轻触触摸屏 public boolean onDown(MotionEvent e) { Log.i("MyGesture1", "onDown"); return false; } // 2. 用户轻触触摸屏,尚未松开或拖动 // 与onDown()的区别:无松开 / 拖动 // 即:当用户点击的时,onDown()就会执行,在按下的瞬间没有松开 / 拖动时onShowPress就会执行 public void onShowPress(MotionEvent e) { Log.i("MyGesture", "onShowPress"); } // 3. 用户长按触摸屏 public void onLongPress(MotionEvent e) { Log.i("MyGesture", "onLongPress"); } // 4. 用户轻击屏幕后抬起 public boolean onSingleTapUp(MotionEvent e) { Log.i("MyGesture", "onSingleTapUp"); return true; } // 5. 用户按下触摸屏 & 拖动 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true; } // 6. 用户按下触摸屏、快速移动后松开 // 参数: // e1:第1个ACTION_DOWN MotionEvent // e2:最后一个ACTION_MOVE MotionEvent // velocityX:X轴上的移动速度,像素/秒 // velocityY:Y轴上的移动速度,像素/秒 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i("MyGesture", "onFling"); return true; } // OnDoubleTapListener的函数 // 1. 单击事件 // 关于OnDoubleTapListener.onSingleTapConfirmed()和 OnGestureListener.onSingleTapUp()的区别 // onSingleTapConfirmed:再次点击(即双击),则不会执行 // onSingleTapUp:手抬起就会执行 public boolean onSingleTapConfirmed(MotionEvent e) { Log.i("MyGesture", "onSingleTapConfirmed"); return false; } // 2. 双击事件 public boolean onDoubleTap(MotionEvent e) { Log.i("MyGesture", "onDoubleTap"); return false; } // 3. 双击间隔中发生的动作 // 指触发onDoubleTap后,在双击之间发生的其它动作,包含down、up和move事件; public boolean onDoubleTapEvent(MotionEvent e) { Log.i("MyGesture", "onDoubleTapEvent"); return false; } }); // 步骤2:重写View的onTouch函数,将触屏事件交给GestureDetector处理,从而对用户手势作出响应 mTextView = (TextView) findViewById(R.id.textView); mTextView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; } }); } }

5. 测试效果

日志效果如下

干货 | 不了解这些多线程的基础知识,很难学懂Android!

至此,关于Android手势识别类GestureDetector类使用讲解完毕。

作者:Carson_Ho
链接:https://www.jianshu.com/p/2cb7ec3d3d5a


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了sqlserver云存储和本地存储的区别,云存储是将数据存储在网络上,方便查看和调用;本地存储是将数据存储在电脑磁盘上,只能在存储的电脑上查看。同时提供了几种启动sqlserver的方法。此外,还介绍了如何导出数据库的步骤和工具。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
author-avatar
杨芷寻找最真的自己
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有